package com.boot2.core.utils;


import com.boot2.core.HlAssert;
import com.boot2.core.dict.ErrorCode;
import com.boot2.core.model.vo.Result;
import com.boot2.core.web.RequestContext;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author zhangweilin
 * @ClassName: ResponseBuilder
 * @description: 构建返回实体
 * @date 2017年11月16日 下午3:35:22
 */
public class ResultBuilder {

    /**
     * 在controller中连续构建map的
     */
    private static String reponseSuccessMapKey = "_reponse_success_map";
    private static Map<String, String> _errorMap = new HashMap<>();

    public static Map<String, String> getErrorMap() {
        return _errorMap;
    }

    /**
     * 在各工程中初始化属于自己的errorCode，在工程启动时初始化
     *
     * @param errorMap
     */
    public static void initErrorCodeMap(Map<String, String> errorMap) {
        ResultBuilder._errorMap = errorMap;
    }

    /**
     * 构建返回对象， 此一般为错误对象， 一般为REST FUL API所用
     *
     * @param errorCode
     * @return
     */
    public static <T> Result<T> buildResult(String errorCode) {
        Result<T> result = new Result<T>();
        result.setCode(errorCode);
        result.setMessage(_errorMap.get(errorCode));
        return result;
    }

    /**
     * 构建返回对象， 此一般为错误对象， 一般为REST FUL API所用
     *
     * @param errorCode
     * @return
     */
    public static <T> Result<T> buildResult(Integer errorCode) {
        Result<T> result = new Result<>();
        result.setCode(errorCode + "");
        result.setMessage(_errorMap.get(errorCode + ""));
        return result;
    }

    /**
     * 构建返回对象， 此一般为错误对象， 一般为REST FUL API所用
     *
     * @param errorCode
     * @param message
     * @return
     */
    public static <T> Result<T> buildResult(String errorCode, Object message) {
        Result<T> result = new Result<>();
        result.setCode(errorCode);
        result.setMessage(message);
        return result;
    }

    /**
     * 构建返回对象， 此一般为错误对象， 一般为REST FUL API所用
     *
     * @param errorCode
     * @param message
     * @return
     */
    public static <T> Result<T> buildResult(String errorCode, T result, Object message) {
        Result<T> response = new Result<>();
        response.setCode(errorCode);
        response.setResult(result);
        response.setMessage(message);
        return response;
    }

    /**
     * 构建返回对象， 此一般为错误对象， 一般为REST FUL API所用
     *
     * @param errorCode
     * @param message
     * @return
     */
    public static <T> Result<T> buildResult(Integer errorCode, T result, Object message) {
        Result<T> response = new Result<>();
        response.setCode(errorCode + "");
        response.setResult(result);
        response.setMessage(message);
        return response;
    }

    /**
     * 构建返回对象， 此一般为错误对象， 一般为REST FUL API所用
     *
     * @param errorCode
     * @param errorMessageList
     * @return
     */
    public static <T> Result<T> buildResult(String errorCode, List<Object> errorMessageList) {
        Result<T> result = new Result<T>();
        result.setCode(errorCode);
        result.setMessageList(errorMessageList);
        return result;
    }

    /**
     * 构建返回对象， 此一般为错误对象， 一般为REST FUL API所用
     *
     * @param errorCode
     * @param errorMessageList
     * @return
     */
    public static <T> Result<T> buildResult(String errorCode, T result, List<Object> errorMessageList) {
        Result<T> response = new Result<T>();
        response.setCode(errorCode);
        response.setResult(result);
        response.setMessageList(errorMessageList);
        return response;
    }

    /**
     * 构建返回对象，此为一般返回正常结果集， 一般为REST FUL API所用
     *
     * @param result
     * @return
     */
    public static <T> Result<T> buildResult(T result) {
        Result<T> response = new Result<>();
        response.setCode(ErrorCode.code_200);
        response.setResult(result);
        return response;
    }

    /**
     * 构建返回对象，此为一般返回正常结果集， 一般为REST FUL API所用
     * 此仅对分页结果
     *
     * @param result
     * @return
     */
    public static <T> Result<T> buildPageResult(Object result) {
        Result<T> response = new Result<>();
        response.setCode(ErrorCode.code_200);
        response.setPageResult(result);
        return response;
    }

    /**
     * 构建返回对象，此为一般返回正常结果集， 一般为REST FUL API所用
     *
     * @param result
     * @return
     */
    public static <T> Result<Map<String, T>> buildSuccessMapResponse(String key, T t) {
        HttpServletRequest request = RequestContext.getRequest();
        HlAssert.notNull(request, "上下文为空，不能连续添加map");
        //基于request，所以不存在并发安全
        Map<String, T> successMap = (Map<String, T>) request.getAttribute(reponseSuccessMapKey);
        if (null == successMap) {
            successMap = new HashMap<>();
        }
        successMap.put(key, t);
        request.setAttribute(reponseSuccessMapKey, successMap);
        Result<Map<String, T>> result = new Result<>();
        result.setCode(ErrorCode.code_200);
        result.setResult(successMap);
        return result;
    }
}
